import 'package:aliplayer_widget/utils/log_util.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:yyshort/common/apis/apis.dart';
import 'package:yyshort/common/model/useInfo_model.dart';
import 'package:yyshort/common/routers/names.dart';
import 'package:yyshort/common/utils/alert_dialog_utils.dart';
import 'package:yyshort/common/widgets/widgets.dart';
import 'package:yyshort/pages/ali_player/short_video/SharedDataController.dart';
import 'package:yyshort/pages/ali_player/utils/navigate_util.dart';
import 'package:yyshort/pages/personal/about_us_page.dart';
import 'package:yyshort/pages/personal/feedback_page.dart';
import 'package:yyshort/pages/personal/language_selection_page.dart';

import 'index.dart';

class PersonalController extends GetxController
    with GetSingleTickerProviderStateMixin {
  PersonalController();

  final state = PersonalState();
  // 用于避免重复刷新的标记
  bool _hasRefreshed = false;

  /// 在 widget 内存中分配后立即调用。
  @override
  Future<void> onInit() async {
    super.onInit();

    eventBus.on<NetWorkRefreshEvent>().listen((event) async {
      await fetchUserInfo();
    });
    // 初始加载用户信息s
    await fetchUserInfo();
    print('刷新用户信息');

    // 修复：使用通用路由监听方式，兼容所有GetX版本
    Get.routing.addListener(_handleRouteChange);
  }

  /// 处理路由变化的回调函数
  void _handleRouteChange() {
    // 当当前路由是个人中心页面，并且之前没有刷新过
    if (Get.currentRoute == AppRoutes.Personal && !_hasRefreshed) {
      onPageShown();
      _hasRefreshed = true;
    }
    // 当离开个人中心页面，重置刷新标记
    else if (Get.currentRoute != AppRoutes.Personal) {
      _hasRefreshed = false;
    }
  }

  /// 在 onInit() 之后调用 1 帧。这是进入的理想场所
  @override
  Future<void> onReady() async {
    super.onReady();
    await fetchUserInfo();
  }

  /// 页面显示时调用
  Future<void> onPageShown() async {
    await fetchUserInfo();
  }

  /// 统一的用户信息获取方法
  Future<void> fetchUserInfo() async {
    await UserAPI.get_user_info();
    print('(------- 更新用户信息--余额： ${UserInfo().coin}');
  }

  /// 在 [onDelete] 方法之前调用。
  @override
  void onClose() {
    // 移除路由监听器，防止内存泄漏
    Get.routing.removeListener(_handleRouteChange);
    super.onClose();
  }

  /// dispose 释放内存
  @override
  void dispose() {
    super.dispose();
  }

  Future<void> junpToNextPage(BuildContext context, int index) async {
    switch (index) {
      case 0:
        Get.toNamed(AppRoutes.Favorite_List);
        break;
      case 1:
        Get.to(
          LanguageSelectionPage(),
          duration: const Duration(milliseconds: 250),
          opaque: false,
        );
        break;
      case 2:
        logd('跳转反馈页面');
        Get.to(
          const FeedbackPage(),
          duration: const Duration(milliseconds: 250),
          opaque: false,
        );
        break;
      case 3:
        logd('跳转充值记录页面');
        Get.toNamed(AppRoutes.Record);
        break;
      case 4:
        logd('跳转充值记录页面');
        break;
      case 5:
        logd('jump to AboutUsPage');
        Get.to(
          const AboutUsPage(),
          duration: const Duration(milliseconds: 250),
          opaque: false,
        );
        break;
      case 6:
        AlertDialogUtils.showPlatformDialog(
          context: context,
          title: "温馨提示".tr,
          content: "即将退出当前账号".tr,
          confirmText: "确认".tr,
          cancelText: "取消".tr,
          onConfirm: () async {
            if (UserInfo().loginType != 0) {
              bool result = await UserAPI.logout();
              cheackResult(result);
            } else {
              bool result = await UserAPI.user_cancel();
              cheackResult(result);
            }
          },
          onCancel: () {},
        );
        break;
      case 7:
        if (UserInfo().loginType != 0) {
          AlertDialogUtils.showPlatformDialog(
            context: context,
            title: '温馨提示'.tr,
            content: '注销提示文字'.tr,
            confirmText: "确认".tr,
            cancelText: "取消".tr,
            onConfirm: () async {
              bool result = await UserAPI.user_cancel();
              cheackResult(result);
            },
            onCancel: () {},
          );
        }
        break;
      default:
        break;
    }
  }

  Future<void> cheackResult(bool result) async {
    if (result) {
      UserInfo().clearUserInfo();
      await UserAPI.guestLogin();
      await fetchUserInfo(); // 使用统一方法刷新
    } else {
      toastInfo(msg: '操作失败'.tr);
    }
  }

  Future<void> setAutoBuyEnabled(bool value) async {
    int autoNum = value ? 1 : 0;
    UserInfo().isAutoBuy = autoNum;

    bool result;
    if (value) {
      result = await UserAPI.auto_buy_setting(is_auto_buy: 1);
      if (result) {
        toastInfo(msg: '自动购买开启成功'.tr);
      } else {
        toastInfo(msg: '自动购买开启失败'.tr);
      }
    } else {
      result = await UserAPI.auto_buy_setting(is_auto_buy: 0);
      if (result) {
        toastInfo(msg: '自动购买关闭成功'.tr);
      } else {
        toastInfo(msg: '自动购买开启失败'.tr);
      }
    }
    // 更新用户信息
    if (result) {
      await fetchUserInfo();
    }
  }
}

extension RoutingExtension on Routing {
  // 存储路由监听器的集合
  List<void Function()> get _routeListeners => [];

  /// 添加路由变化监听器
  void addListener(void Function() handleRouteChange) {
    if (!_routeListeners.contains(handleRouteChange)) {
      _routeListeners.add(handleRouteChange);
      // 当添加第一个监听器时，设置路由变化回调
      if (_routeListeners.length == 1) {
        addListener(() {
          // 通知所有监听器路由已变化
          for (var listener in _routeListeners) {
            listener();
          }
        });
      }
    }
  }

  /// 移除路由变化监听器
  void removeListener(void Function() handleRouteChange) {
    _routeListeners.remove(handleRouteChange);
    // 当没有监听器时，清理资源
    if (_routeListeners.isEmpty) {
      // 这里可以根据需要添加清理逻辑
    }
  }
}
